iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
自我挑戰組

SPYxFRONTEND ~ 懂一點後端真是讓人哇哭哇哭系列 第 6

[Day6] 巧婦難為無米之炊~ 第一步就先從取得資料開始吧!之 import 篇

  • 分享至 

  • xImage
  •  

前言

昨天提到資料取得的三種方法,

1.變數 → 2.import檔案 → 3. call API

並且介紹了入門款的 1.變數
那今天當然是介紹 2. import檔案 囉!

本日正文

首先接續昨天的例子─鐵人餐廳銷售排行,
正常來說,
你不可能會將資料寫死在頁面上,
因為 1)這些資料會隨時間動態變化 2)資料量很多,你不可能手動做,批次處理比較有效率

資料通常會是從檔案讀進去或是去 call API 得到的,
那麼今天我們假設有人看你是練武奇才給你一份檔案

你拿到餐廳上個月的銷售紀錄檔案,
而且這份檔案極大機率是 Excel 檔,像這樣:
https://ithelp.ithome.com.tw/upload/images/20220907/20129873DiwLLkYxd1.png
那麼你要怎樣才能把它轉成 程式比較好處理的 JSON 檔呢?

現在有滿多網站都支援 XLS 轉 JSON 的,
試了幾個網站,發現 ASPOSE 這個網站可以處理中文(不然中文大多數會有轉換完亂碼問題),
所以我們今天就拿這個網站來試著轉檔吧!

打開這個網站首先你會先看到這個畫面:
https://ithelp.ithome.com.tw/upload/images/20220907/201298739zZd9KOhKT.png

再來選擇準備好的 Excel 檔:
https://ithelp.ithome.com.tw/upload/images/20220907/20129873pnABHtZNiM.png

選擇要轉換的格式 (JSON) 再按下兌換:
https://ithelp.ithome.com.tw/upload/images/20220907/20129873i544lLMwtb.png

然後你就可以看到 Excel 已經順利被轉成 JSON 格式了~(拍手)
https://ithelp.ithome.com.tw/upload/images/20220907/201298738dtZaFnxI1.png

[
  {
    "品項": "牛肉麵",
    "銷售量": 66
  },
  {
    "品項": "小籠包",
    "銷售量": 55
  },
  {
    "品項": "滷肉飯",
    "銷售量": 30
  },
  {
    "品項": "蚵仔麵線",
    "銷售量": 25
  },
  {
    "品項": "蚵仔煎",
    "銷售量": 20
  }
]

然後我們就可以準備來改寫昨天的範例啦!
首先先在 CodeSandbox 新增一個 sales.json
然後把上面產生的 JSON 資料貼過去,
像這樣:
https://ithelp.ithome.com.tw/upload/images/20220907/20129873hCrPq9SU2I.png

再回到 App.tsx 的前面 import 我們剛剛準備好的 json 檔,
像這樣:

import sales from './sales.json';

我的習慣是會去埋 console.log 看一下有沒有讀到資料,
像這樣:

console.log(sales);

https://ithelp.ithome.com.tw/upload/images/20220907/20129873KWQ3AuHRgI.png

看來有成功 import 到!
那就可以來進行改寫啦!

我的習慣是,
在改寫成動態迴圈讀資料時,
會先寫一版是假資料的(一筆即可),
確保排版沒問題,
再把假資料換成變數就很容易了~

例如說原本是這樣:

<OrderedList px={4}>
	<ListItem my={2}>
	  <Flex>
		<Text>牛肉麵</Text>
		{66 >= hitCount ? (
		  <Tag ml={2} size="sm" variant="solid" colorScheme="red">
			人氣料理
		  </Tag>
		) : null}
	  </Flex>
	  <Text>銷售量:66</Text>
	</ListItem>
  </OrderedList>

那麼只要把料理名稱換成 json 裡面的 品項
銷售量後面的數字換成 json 裡面的 銷售量
就大功告成啦!

當然前面要寫 map 去讀每一筆資料啦XD
所以觀察下來,我們知道 <ListItem> 是每一筆資料都會有的,
所以 map 從 <ListItem> 前面開始寫,

{sales.map((x) => (
    ...
))}

然後再把原本寫假資料的地方都換成變數,

牛肉麵 => {x.品項}
66 => {x.銷售量}

像這樣:

<OrderedList px={4}>
	{sales.map((x) => (
	  <ListItem my={2}>
		<Flex>
		  <Text>{x.品項}</Text>
		  {x.銷售量 >= hitCount ? (
			<Tag ml={2} size="sm" variant="solid" colorScheme="red">
			  人氣料理
			</Tag>
		  ) : null}
		</Flex>
		<Text>銷售量:{x.銷售量}</Text>
	  </ListItem>
	))}
</OrderedList>

https://ithelp.ithome.com.tw/upload/images/20220907/20129873aw3n0sppuw.png

然後你會發現,
不只原本的牛肉麵,
連在 Excel 中出現的其它料理資料(json)也出現了!

不只主要的資料部份,
連時間你也想改成動態取得現在的年及月份,當然是OK的!

前面我們先宣告 today 的變數取得現在時間,
然後就如法炮製把年及月份的地方改成變數,
像這樣:

const today = new Date();
...(略)
<Text my={4} as="h2" fontSize="2xl" textAlign="center">
	{today.getFullYear()} 鐵人餐廳 {today.getMonth()+1}月 銷售排行 TOP5
</Text>

(PS. 月份的部份 getMonth 記得要+1,因為月份從0開始,詳見這邊說明:Date - JavaScript - MDN Web Docs)
https://ithelp.ithome.com.tw/upload/images/20220907/20129873MvXxtSBy6b.png

以上就是介紹 import 檔案,一個很常見的取得資料的手法,
然後明天我們就要正式進入 call API 拿資料啦~~~

然後一樣附上今天的 CodeSandbox:
2022Day6 - Chakra UI

後記

其實寫到今天有點像是在寫資料如何處理了啦orz
資料處理只是前菜,
相信我,本系列文的正題快要登場了!(應該是?


上一篇
[Day5] 巧婦難為無米之炊~ 第一步就先從取得資料開始吧!之 變數篇
下一篇
[Day7] 來到 call API 的第一道門 ~ AJAX - XMLHttpRequest 篇
系列文
SPYxFRONTEND ~ 懂一點後端真是讓人哇哭哇哭30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言